1 package net.sourceforge.simplegamenet.chess; 2 3 import java.io.Serializable; 4 import net.sourceforge.simplegamenet.specs.model.GameServer; 5 import net.sourceforge.simplegamenet.specs.model.ServerEngine; 6 import net.sourceforge.simplegamenet.specs.to.PlayerSettings; 7 8 public class ChessServer extends GameServer implements ChessPacketCodes, 9 ChessPlayFieldState { 10 11 private ChessPlayField chessPlayField = null; 12 13 private boolean remiseOfferable = false; 14 15 public ChessServer(ServerEngine serverEngine) { 16 super(serverEngine); 17 } 18 19 public void playerAdded(PlayerSettings playerSettings) { 20 if (serverEngine.isGamePlaying()) { 21 serverEngine.sendData(playerSettings.getPlayerID(), 22 new ChessPacket(PLAY_FIELD, chessPlayField)); 23 } 24 } 25 26 public void playerRemoved(PlayerSettings playerSettings) { 27 if (serverEngine.isGamePlaying() 28 && playerSettings.getPlayingState() == PlayerSettings.PARTICIPATING) { 29 chessPlayField.yieldGame(playerSettings.getPlayerID()); 30 Integer winningPlayerID = chessPlayField.getParticipantAtTurnPlayerID(); 31 serverEngine.appendGameChatMessage(serverEngine.getPlayerSettingsMap() 32 .getPlayerSettings(winningPlayerID) 33 .getNickname() 34 + " has won the game."); 35 serverEngine.stopGame(); 36 } 37 } 38 39 public void gameStarted() { 40 Integer[] originParticipantIDs = serverEngine.getPlayerSettingsMap() 41 .getParticipantIDs(); 42 Integer[] participantsOrder = new Integer[originParticipantIDs.length]; 43 int originParticipantIDsLength = originParticipantIDs.length; 44 for (int i = 0; i < participantsOrder.length; i++) { 45 int randomNumberIndex = (int) (Math.random() * (originParticipantIDsLength)); 46 participantsOrder[i] = originParticipantIDs[randomNumberIndex]; 47 for (int j = randomNumberIndex; j < originParticipantIDsLength - 1; j++) { 48 originParticipantIDs[j] = originParticipantIDs[j + 1]; 49 } 50 originParticipantIDsLength--; 51 } 52 chessPlayField = new ChessPlayField(participantsOrder); 53 remiseOfferable = true; 54 serverEngine.sendData(new ChessPacket(PARTICIPANTS_ORDER, participantsOrder)); 55 } 56 57 public void receiveData(Integer playerID, Serializable data) { 58 if (!(data instanceof ChessPacket)) { 59 serverEngine.kickProtocolViolatingPlayer(playerID); 60 return; 61 } 62 ChessPacket chessPacket = (ChessPacket) data; 63 switch (chessPacket.packetCode) { 64 65 case MAKE_MOVE: 66 if (!(chessPacket.data instanceof ChessMove)) { 67 serverEngine.kickProtocolViolatingPlayer(playerID); 68 return; 69 } 70 ChessMove chessMove = (ChessMove) chessPacket.data; 71 if (playerID.equals(chessPlayField.getParticipantAtTurnPlayerID()) 72 && chessPlayField.isMoveAllowed(chessMove.sourceX, chessMove.sourceY, 73 chessMove.destinationX, chessMove.destinationY, 74 chessMove.chosenPieceType)) { 75 int chessPlayFieldState = chessPlayField.doMove(chessMove.sourceX, chessMove.sourceY, 76 chessMove.destinationX, chessMove.destinationY, 77 chessMove.chosenPieceType); 78 serverEngine.sendData(new ChessPacket(MOVE_MADE, chessMove)); 79 switch (chessPlayFieldState) { 80 case NORMAL_STATE: 81 case CHECK: 82 remiseOfferable = true; 83 break; 84 case CHECKMATE: 85 serverEngine.appendGameChatMessage(serverEngine.getPlayerSettingsMap() 86 .getPlayerSettings(playerID) 87 .getNickname() 88 + " has won the game."); 89 serverEngine.stopGame(); 90 break; 91 case STALEMATE: 92 serverEngine.appendGameChatMessage("The game is remise by stalemate."); 93 serverEngine.stopGame(); 94 break; 95 case REMISE: 96 serverEngine.appendGameChatMessage("The game is remise."); 97 serverEngine.stopGame(); 98 break; 99 } 100 } else { 101 serverEngine.sendData(playerID, new ChessPacket(E_MAKE_MOVE, null)); 102 } 103 break; 104 105 case MAKE_YIELD: 106 if (playerID.equals(chessPlayField.getParticipantAtTurnPlayerID())) { 107 chessPlayField.yieldGame(chessPlayField.getParticipantAtTurnPlayerID()); 108 serverEngine.sendData(new ChessPacket(YIELD_MADE, null)); 109 Integer winningPlayerID = chessPlayField.getParticipantAtTurnPlayerID(); 110 serverEngine.appendGameChatMessage(serverEngine.getPlayerSettingsMap() 111 .getPlayerSettings(winningPlayerID) 112 .getNickname() 113 + " has won the game."); 114 serverEngine.stopGame(); 115 } 116 break; 117 118 case OFFER_REMISE: 119 if (playerID.equals(chessPlayField.getParticipantAtTurnPlayerID())) { 120 if (!remiseOfferable) { 121 serverEngine.sendData(playerID, new ChessPacket(E_OFFER_REMISE, null)); 122 return; 123 } 124 remiseOfferable = false; 125 chessPlayField.setWaitingForRemiseOfferAnswer(); 126 serverEngine.sendData(new ChessPacket(REMISE_OFFERED, null)); 127 } 128 break; 129 case ACCEPT_REMISE: 130 if (serverEngine.getPlayerSettingsMap().getPlayerSettings(playerID) 131 .getPlayingState() == PlayerSettings.PARTICIPATING 132 && !playerID.equals(chessPlayField.getParticipantAtTurnPlayerID())) { 133 chessPlayField.setRemiseOfferAnswer(true); 134 serverEngine.sendData(new ChessPacket(REMISE_ACCEPTED, null)); 135 serverEngine.appendGameChatMessage("The game is remise."); 136 serverEngine.stopGame(); 137 } 138 break; 139 case DECLINE_REMISE: 140 if (serverEngine.getPlayerSettingsMap().getPlayerSettings(playerID) 141 .getPlayingState() == PlayerSettings.PARTICIPATING 142 && !playerID.equals(chessPlayField.getParticipantAtTurnPlayerID())) { 143 chessPlayField.setRemiseOfferAnswer(false); 144 serverEngine.sendData(new ChessPacket(REMISE_DECLINED, null)); 145 } 146 break; 147 148 default: 149 serverEngine.kickProtocolViolatingPlayer(playerID); 150 } 151 } 152 153 public void gameAborting() { 154 chessPlayField.setRemiseOfferAnswer(true); 155 serverEngine.appendGameChatMessage("The game is remise because the game was " 156 + "aborted."); 157 } 158 159 }